package com.rinoiot.weather.entity;

import com.alibaba.fastjson.annotation.JSONField;
import com.rinoiot.weather.entity.Vo.CurrentWeatherVo;
import lombok.Data;

import java.util.Date;
import java.util.List;

/**
 * OpenWeather返回天气数据实体类
 */
@Data
public class OpenWeatherEntity {

    private Coord coord;
    private List<Weather> weather;
    // 内部参数
    private String base;
    private Main main;
    // 能见度，仪表。能见度最大值为10km
    private int visibility;
    private Wind wind;
    private Clouds clouds;
    private Rain rain;
    private Snow snow;
    // 数据计算时间，unix，UTC
    private long dt;
    private Sys sys;
    // 以秒为单位从 UTC 偏移
    private int timezone;
    // 城市编号
    private long id;
    // 城市名
    private String name;
    // 内部参数
    private int cod;


    @Data
    public static class Coord {
        // 城市地理位置，经度
        private Double lon;
        // 城市地理位置、纬度
        private Double lat;
    }

    @Data
    public static class Weather {
        // 天气状况 ID
        private Integer id;
        // 一组天气参数（雨、雪、极端等）
        private String main;
        // 组内天气状况。您可以使用您的语言获得输出
        private String description;
        // 天气图标 ID
        private String icon;
    }

    @Data
    public static class Main {
        // 温度。单位默认值：开尔文，公制：摄氏，英制：华氏。
        private Double temp;
        // 温度。这个温度参数解释了人类对天气的感知。单位默认值：开尔文，公制：摄氏，英制：华氏。
        private Double feels_like;
        // 目前最低温度。这是目前观察到的最低温度（在大都市和城市地区）。单位默认值：开尔文，公制：摄氏，英制：华氏。
        private Double temp_min;
        // 目前最高温度。这是目前观察到的最高温度（在大都市和城市地区）。单位默认值：开尔文，公制：摄氏，英制：华氏。
        private Double temp_max;
        // 大气压力（在海平面上，如果没有 sea_level 或 grnd_level 数据），hPa
        private Double pressure;
        // 湿度， ％
        private Double humidity;
    }

    @Data
    public static class Wind {
        // 风速。单位默认值：米/秒，公制：米/秒，英制：英里/小时。
        private Double speed;
        // 风向，度数（气象）
        private Double deg;
        // 阵风。单位默认值：米/秒，公制：米/秒，英制：英里/小时
        private Double gust;
    }

    @Data
    public static class Clouds {
        // 云量，%
        private Integer all;
    }

    @Data
    public static class Rain {
        // 近 1 小时雨量，mm
        @JSONField(name = "1h")
        private Integer h1;
        // 近 3 小时雨量，mm
        @JSONField(name = "3h")
        private Integer h3;
    }

    @Data
    public static class Snow {
        // 近 1 小时雪量，mm
        @JSONField(name = "1h")
        private Integer h1;
        // 近 3 小时雪量，mm
        @JSONField(name = "3h")
        private Integer h3;
    }

    @Data
    public static class Sys {
        // 内部参数
        private Integer type;
        // 内部参数
        private Integer id;
        // 内部参数
        private String message;
        // 国家代码（GB、JP 等）
        private String country;
        // 日出时间，unix，UTC
        private Long sunrise;
        // 日落时间，unix，UTC
        private Long sunset;
    }

    public CurrentWeatherVo trans() {
        CurrentWeatherVo vo = new CurrentWeatherVo();
        vo.setCreateTime(System.currentTimeMillis());
        vo.setDescription(this.getWeather().get(0).getDescription());
        vo.setCityName(this.getName());
        vo.setLat(this.getCoord().getLat());
        vo.setLon(this.getCoord().getLon());

        vo.setTemp(String.valueOf(this.getMain().getTemp()));
        vo.setRealFeel(String.valueOf(this.getMain().getFeels_like()));
        vo.setHumidity(String.valueOf(this.getMain().getHumidity()));
        vo.setPressure(String.valueOf(this.getMain().getPressure()));
        vo.setVis(String.valueOf(this.getVisibility()));
        vo.setWindDir(String.valueOf(this.getWind().getDeg()));
        vo.setWindSpeed(String.valueOf(this.getWind().getSpeed()));
//        vo.setApi(String.valueOf(this.getData().get(0).getAqi()));
        String sunR = CurrentWeatherVo.sdf.format(new Date(this.getSys().getSunrise() * 1000));
        vo.setSunRise(sunR);
        String sunS = CurrentWeatherVo.sdf.format(new Date(this.getSys().getSunset() * 1000));
        vo.setSunSet(sunS);

        return vo;
    }

}
